from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection
from django import http
import random

from apps.verifications.libs.captcha.captcha.captcha import captcha
from . import constants
from fight.utils.response_code import RETCODE
from apps.verifications.libs.yuntongxun.ccp_sms import sendTemplateSMS
# Create your views here.

class SMSCodeView(View):
    """短信验证码"""

    def get(self, reqeust, mobile):
        """
        :param reqeust: 请求对象
        :param mobile: 手机号
        :return: JSON
        """
        # 判断用户是否平凡发送短信
        # 提取发送短信的标记
        redis_conn = get_redis_connection("verify_code")
        send_flag = redis_conn.get("send_flag_%s" %mobile)
        # 判断发送短信的标记是否存在,如果存在表示频繁发送
        if send_flag:
            return http.JsonResponse({"code":RETCODE.THROTTLINGERR,"errmsg":"发送短信过于频繁"})

        # 接收参数
        image_code_client = reqeust.GET.get("image_code")
        uuid = reqeust.GET.get("uuid")

        # 校验参数
        if not all([image_code_client, uuid]):
            return http.HttpResponseForbidden("缺少必传参数")

        # 提取图形验证码(图形验证码从Redis中提取到美多商城的内存当中

        image_code_server = redis_conn.get("img_%s" % uuid)
        if image_code_server is None:
            return http.JsonResponse({"code":RETCODE.IMAGECODEERR,"errmsg":"图形验证码失效"})
        # 删除图形验证码(这里删除的时Redis中的验证码,防止恶意测试图形验证码)
        redis_conn.delete("img_%s" % uuid)
        # 对比图形验证码
        # 提示: 在redis中提取的所有数据都是bytes类型的数据
        # 而image_code_client是字符串类型的,不同类型无法比较
        image_code_server = image_code_server.decode()
        if image_code_client.lower() != image_code_server.lower():
            return http.JsonResponse({"code":RETCODE.IMAGECODEERR,"errmsg":"图形验证码有误"})

        # 生成短信验证码
        sms_code = "%06d" % random.randint(0,999999)
        # 保存短信验证码 (为注册逻辑中追加短信验证做准备)
        # setxt("key","过期时间","value")
        redis_conn.setex("sms_%s" %mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)

        # 保存发送短信的标记
        redis_conn.setex("send_flag_%s" %mobile,constants.SEND_SMS_CODE_INTERVAL,1)

        # 发送短信验证码
        # sendTemplateSMS(手机号,[验证码,过期时间:单位分钟],模板ID)
        sendTemplateSMS(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES // 60],constants.SEND_SMS_TEMPLATE_ID)
        # 响应结果
        return http.JsonResponse({"code":RETCODE.OK,"errmsg":"OK"})


class ImageCodeView(View):
    """图形验证码"""

    def get(self,request,uuid):
        """提供图形验证码"""
        # uuid: 前端传入的唯一标识图形验证码属于哪个用户的
        # return: image/jpg

        # 接收参数
        # 校验参数
        # 生成图形验证码(text,image) 贝塞尔曲线 画图的
        text, image = captcha.generate_captcha()

        # 保存图形验证码
        # 创建连接到redis2号库的对象
        redis_conn = get_redis_connection("verify_code")
        # 使用redis_conn操作redis2号库
        # redis_conn.setex("key","过期时间","value") # 图形验证码需要有有效期
        redis_conn.setex("img_%s" % uuid,constants.IMAGE_CODE_REDIS_EXPIRES,text)

        # 响应图形验证码
        return http.HttpResponse(image,content_type="image/jpg")